﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using HtmlAgilityPack;
using LinqToExcel;
using NameSpaceProgram;

namespace ExcelToVT
{
    static class ExtensionIEnumerable
    {
        /// <summary>
        /// IEnumerable tipinde dizi içinde parametrede verilen metoda dizi elemanlarını ve indeksini geçirir.
        /// </summary>
        /// <typeparam name="T">İçinde dönülecek dizinin tipi</typeparam>
        /// <param name="e">İçinde dönülecek dizi</param>
        /// <param name="del">Dizi elemanlarının ve elemanın indeks değerinin gönderileceği metot</param>
        public static void ForEachIndex<T>(this IEnumerable<T> e, Action<T, int> del)
        {
            var i = 0;
            foreach (var cur in e)
            {
                del(cur, i);
            }
        }
    }
    public class SKRS3ExcelToDB
    {
        private string m_CnnStrName;
        public SKRS3ExcelToDB(string _sConnectionStringName)
        {
            m_CnnStrName = _sConnectionStringName;
        }
        public FileInfo f_ToVT(ExcelDosya _excel, string _sSheetName = "AKTİF ÜRÜNLER LİSTESİ")
        {
            if (!Directory.Exists("c:\\Temp"))
            {
                throw new FileNotFoundException("C:\\Temp klasörü bulunamadı! Bu yüzden excel dosyası oluşturulamıyor ve sorgulanamıyor.");
            }

            string sExcelFileName = string.Format("C:\\Temp\\excel_{0}.xlsx", DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss"));
            var fi = new FileInfo(sExcelFileName);
            File.WriteAllBytes(fi.FullName,_excel.Dosya);

            // Excel'deki verilerimizi DataTable nesnemiz dtExcel'e aktarıyoruz.
            IQueryable<IEGMIlac> dtExcel = f_SheetToDataTable(fi.FullName, _sSheetName);
            var a = "";
            dtExcel.AsEnumerable().ForEachIndex((g, h) =>
                                                    {
                                                        new Ilac(m_CnnStrName, g);
                                                    });
            var b = from iegmIlac in dtExcel
                    select new[] {new Ilac(m_CnnStrName, iegmIlac)};
            return fi;
        }

        public string f_SayfayiIndir(string _sUrl)
        {
            Uri uri = _sUrl != null
                      ? new Uri(_sUrl)
                      : new Uri("http://www.iegm.gov.tr/Default.aspx?sayfa=erecete_liste&lang=tr-TR");

            try
            {
                return new WebClient
                {
                    Encoding = Encoding.UTF8
                }.DownloadString(uri);
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("{0} Adresinden HTML kaynak kodu indirilirken istisna fırlatıldı.", uri.AbsoluteUri));
            }
        }


        FileInfo f_DosyaIndir(Uri _Uri, DirectoryInfo _dirKaydedilecekKlasor)
        {
            try
            {
                string sDosyaYolu = _dirKaydedilecekKlasor.FullName + "\\" + _Uri.Segments[_Uri.Segments.Length - 1];

                new WebClient().DownloadFile(_Uri, sDosyaYolu);
                return new FileInfo(sDosyaYolu);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public List<ExcelDosya> f_DosyaIndir(string _sDomain, string _sHtmlCode, DirectoryInfo _dirKaydedilecekKlasor, string _sATaginda = "E-Reçete İlaç Listesi - ")
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(_sHtmlCode);

            var ed = from lnks in doc.DocumentNode.Descendants()
                        where lnks.Name == "a"
                              && lnks.InnerText.StartsWith(_sATaginda)
                        select
                            new ExcelDosya()
                            {
                                Adres = lnks.Attributes["href"].Value,
                                DosyaTarihi = Convert.ToDateTime(lnks.InnerText.Substring(lnks.InnerText.IndexOf(" - ") + 2).Trim(), new DateTimeFormatInfo() { ShortDatePattern = "dd.MM.yyyy" }),
                                EklenmeTarihi = DateTime.Now,
                                Dosya = File.ReadAllBytes(f_DosyaIndir(f_HrefToUri(_sDomain, lnks.Attributes["href"].Value), _dirKaydedilecekKlasor).FullName),
                            };
            return ed.ToList();
        }


        private Uri f_HrefToUri(string _sDomain, string _sAdres)
        {
            return _sAdres.StartsWith("http")
                                  ? new Uri(_sAdres)
                                  : new Uri(_sDomain.Insert(_sDomain.Length, "/") + _sAdres);
        }

        public IQueryable<IEGMIlac> f_SheetToDataTable(string _sExcelPath, string _sSheetName)
        {
            var excel = new ExcelQueryFactory(_sExcelPath);
            var aktif = from c in excel.WorksheetRangeNoHeader("A3", "F65000", _sSheetName)
                        select new IEGMIlac()
                                   {
                                       skrs_ilac_adi = c[0],
                                       skrs_barkod = Convert.ToDecimal(c[1]),
                                       skrs_firma = c[2],
                                       skrs_recete_turu = c[3],
                                       skrs_durum = c[4],
                                       Aciklama = c[5],
                                   };
            return aktif;
        }

        public ExcelDosya f_SonExcelDosyasi()
        {
            List<ExcelDosya> lstExcelDosyalari = f_DosyaIndir("http://www.iegm.gov.tr/", f_SayfayiIndir(null), new DirectoryInfo(@"c:\temp"));
            if (lstExcelDosyalari.Count == 0)
            {
                throw new Exception("Excel dosyaları bulunamadı!");
            }

            Kontext ktx = new Kontext(m_CnnStrName);
            lstExcelDosyalari.ForEachIndex((cur, idx) => ktx.ExcelDosyalari.Add(cur));
            ktx.SaveChanges();
            

            ExcelDosya sayfadakiSonExcel = lstExcelDosyalari.OrderByDescending(p => p.DosyaTarihi).FirstOrDefault();
            return sayfadakiSonExcel;
        }


        ///// <summary>
        ///// AKTİF İLAÇLARI VT ye yaz
        ///// </summary>
        ///// <param name="cnn"></param>
        ///// <param name="skrs"></param>
        ///// <param name="sayfadakiSonExcel"></param>
        //public void f_AktifIlaclarToVT(SqlConnection cnn, SKRS3ExcelToDB skrs, ExcelDosyasi sayfadakiSonExcel)
        //{
        //    using (var adapter = new SqlDataAdapter("SELECT * FROM Ilaclar", cnn))
        //    {
        //        var dtIlaclar = new DataTable("Ilaclar");
        //        try
        //        {
        //            // Tablomuzun yapısını(şemasını) dataTable nesnemize aktaralım
        //            adapter.Fill(dtIlaclar);

        //            DataTable dtExcelAktif = skrs.f_SheetToDataTable(sayfadakiSonExcel.M_DosyaBilgisi.FullName, "AKTİF ÜRÜNLER LİSTESİ");
        //            DataTable dtExcelPasif = skrs.f_SheetToDataTable(sayfadakiSonExcel.M_DosyaBilgisi.FullName, "PASİF ÜRÜNLER LİSTESİ");
        //            DataTable dtExcelDegisenler = skrs.f_SheetToDataTable(sayfadakiSonExcel.M_DosyaBilgisi.FullName, "DEĞİŞİKLİK YAPILAN ÜRÜNLER");

        //            var h = dtExcelAktif.Rows.Cast<DataRow>().Select(row =>
        //                                                                 {

        //                                                                     var dr = dtIlaclar.Select("Barkod='" + row["skrs_barkod"] + "'");

        //                                                                     if (!dr.Any())
        //                                                                     {
        //                                                                         // barkodlu ilaç VT de yok
        //                                                                         dtIlaclar.LoadDataRow(new object[] { }, LoadOption.Upsert);

        //                                                                     }
        //                                                                     return row;
        //                                                                 });

        //            // Excel'de ilk satır sutun adlarını içerdiği için Skip(1)
        //            // Tablomuzda ilk sütun olan id alanı için her yeni satıra 0 değeri atıyor,
        //            // dtExcel İçindeki satırları tablomuzdaki sıraya göre object[] tipinde arr nesnesinde oluşturuyor,
        //            // VT Tablomuzun şemasını ve 1 satırını içeren dtIlaclarAktif tablomuzun satırlarına ekliyoruz.
        //            var k = Enumerable.Select(dtExcelAktif.Rows.Cast<DataRow>().Skip(0), delegate(DataRow row)
        //                                                                                     {
        //                                                                                         var arr = new[] { 0, row[0], row[1], row[2], row[3], row[4], row[5] };
        //                                                                                         dtIlaclar.LoadDataRow(arr, LoadOption.Upsert);
        //                                                                                         return arr;
        //                                                                                     });
        //            var l = k.ToList();

        //            // InsertCommand'ın null olması sorun çıkartmasın diye SqlCommandBuilder sınıfından bir nesne yaratıyoruz
        //            using (var builder = new SqlCommandBuilder(adapter))
        //            {
        //                adapter.Update(dtIlaclar);
        //            }
        //        }
        //        catch (OleDbException olex)
        //        {
        //            throw new Exception(String.Format("Excel dosyasında sorgu yapılırken şu hata oluştu: {0}", olex.Message),
        //                                olex);
        //        }
        //        catch (Exception ex)
        //        {
        //            throw (ex);
        //        }
        //    }
        //}

        //public void f_PasifIlaclarToVT(SqlConnection cnn, SKRS3ExcelToDB skrs, ExcelDosyasi sayfadakiSonExcel)
        //{

        //}
    }

}

